#include "Tasks.h"

static Task_t task_list[] = {
   // state,         count, period,  callback
  { TASK_STATE_STOP,   100,    100,  App_test_read_task },
//  { TASK_STATE_STOP,   200,    200,  App_test_hi_task },
//  { TASK_STATE_STOP,   500,    500,  App_my_new_task },
//  { TASK_STATE_STOP,   1000,   1000,  App_st7789_test_task },
//  { TASK_STATE_STOP,  100,   100,  App_Protocol_task1 },
//  { TASK_STATE_STOP, 3000,  3000,  App_Protocol_task2 },
//  { TASK_STATE_STOP,  100,   100,  App_OLED_task, App_OLED_suspend},
};

uint8_t task_cnt = sizeof(task_list) / sizeof(Task_t);

// 任务可执行状态切换 timer 1ms执行一次
void Task_switch_handler(void){
  for(uint8_t i = 0; i < task_cnt; i++){
    // 判断如果任务是挂起状态，跳过切换判定
    if (task_list[i].state == TASK_STATE_SUSPEND){
      continue;
    }
    
	if(task_list[i].count > 0) task_list[i].count--;
      
    if (task_list[i].count == 0){
      // 任务状态state切换
      task_list[i].state = TASK_STATE_RUN;
      // 重置count计数值
      task_list[i].count = task_list[i].period;
    }
  }
}

// 任务执行的处理句柄
void Task_exec_handler(void){
  // 将状态为 TASK_STATE_RUN 运行起来，标记恢复成STOP
  for (uint8_t i = 0; i < task_cnt; i++){
    if (task_list[i].state == TASK_STATE_RUN){
	  // 执行任务
      task_list[i].callback();
        		
      // 如果状态在callback运行里改变了,则无需切换成STOP
      if(task_list[i].state != TASK_STATE_RUN){
          continue;
      }
      task_list[i].state = TASK_STATE_STOP;
    }
  }
}

// 根据任务函数名，查找对应位置
int Task_get_task_id(Task_callback func_name){
  for (uint8_t i = 0; i < task_cnt; i++){
    if(task_list[i].callback == func_name){
      return i;
    }
  }
  return -1;
}

// 根据任务索引，获取任务状态
uint8_t Task_get_task_state(uint8_t index){
  if(index >= task_cnt) return TASK_STATE_STOP;
  return task_list[index].state;
}

// 暂停指定任务
void Task_suspend(uint8_t index){
  if(index >= task_cnt) return;
  
  task_list[index].state = TASK_STATE_SUSPEND;
  
  // 挂起回调函数不是NULL，才执行
  if (task_list[index].callback_suspend != 0){
    task_list[index].callback_suspend();
  }
}

// 恢复指定任务
void Task_resume(uint8_t index){
  if(index >= task_cnt) return;
  
  // 重置count计数值
  task_list[index].count = task_list[index].period;
  task_list[index].state = TASK_STATE_RUN;
  
}